home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / wfindblk.c < prev    next >
C/C++ Source or Header  |  1998-10-29  |  3KB  |  122 lines

  1. /*Sucht und markiert Block bei wiedergeöffneten Fenster*/
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                      Modul: WFINDBLK.C
  6. *                                     (c) by TheoSoft '92
  7. *
  8. *****************************************************************************/
  9. #include <portab.h>
  10. #include <stdio.h>
  11. #include <aes.h>
  12.  
  13. #include "windows.h"
  14. #include "undo.h"
  15.  
  16. WINDOW *Wfindblk(WINDOW *wp, WINDOW **blkwp, LINESTRUCT **beg, LINESTRUCT **end)
  17. {
  18.     LINESTRUCT *line;         /* markierten Block im neuen Fenster suchen */
  19.     long bl=0L;
  20.     extern LINESTRUCT *lastwstr;
  21.     extern long lasthfirst,begline,endline;
  22.     extern int cut;
  23.     extern char searchstring[];
  24.  
  25.     if(wp && beg && end)
  26.     {
  27.         for(line=wp->fstr; line; line=line->next,bl++)
  28.         {
  29.             if(line->attr & SELECTED)
  30.             {
  31.                 if(cut && *beg && *end)      /* erst noch Ramblock löschen */
  32.                     free_blk(wp,*beg);
  33.                 begline=endline=bl;
  34.                 lasthfirst=bl*wp->hscroll;
  35.                 lastwstr=line;
  36.  
  37.                 (*beg)=(*end)=line;
  38.                 for(line=line->next; line && line->next; line=line->next)
  39.                 {
  40.                     if(!(line->attr & SELECTED))
  41.                     {
  42.                         if((*beg)->begcol==0 && (*end)->endcol==STRING_LENGTH)
  43.                             endline++;
  44.                         (*blkwp)=wp;
  45.                         return(wp);
  46.                     }
  47.                     else
  48.                     {
  49.                         endline++;
  50.                         (*end)=line;
  51.                     }
  52.                 }
  53.                 (*blkwp)=wp;
  54.                 return(wp);
  55.             }
  56.         }
  57.         if(!cut) /* zumindest kein Block in diesem Fenster */
  58.         {
  59.             (*beg)=(*end)=NULL;
  60.             begline=endline=0L;
  61.         }
  62.     }
  63.     return(NULL);
  64. }
  65.  
  66. int Wrestblk(WINDOW *wp, UNDO *undo, LINESTRUCT **beg, LINESTRUCT **end)
  67. {
  68.     register long i;
  69.     LINESTRUCT *line;
  70.     register int y;
  71.     extern long begline, endline, lasthfirst;
  72.     extern LINESTRUCT *lastwstr;
  73.     
  74.     if(wp)
  75.     {
  76.         lasthfirst=undo->wline*wp->hscroll;
  77.         begline=undo->begline;
  78.         endline=undo->endline;
  79.         line=wp->fstr;
  80.         for(i=0; i<undo->wline; i++, line=line->next)
  81.             ;
  82.         lastwstr=line;
  83.         for(i; i<begline; i++, line=line->next)
  84.             ;
  85.         *end=*beg=line;
  86.         (*beg)->begcol=undo->begcol;
  87.         (*beg)->endcol=undo->endcol;
  88.         for(i; i<endline; i++, line=line->next)
  89.         {
  90.             (*end)=line;
  91.             (*end)->attr|=SELECTED;
  92.             (*end)->begcol=undo->begcol;
  93.             (*end)->endcol=undo->endcol+(undo->blktype==COLUMN?undo->begcol:0);
  94.         }
  95.         if(undo->blktype==COLUMN)
  96.             wp->cspos=(wp->col+=undo->endcol);
  97.         if((undo->blktype!=COLUMN) && ((*beg) != (*end))) /* mehr als eine zeile */
  98.         {
  99.             (*beg)->endcol=STRING_LENGTH;
  100.             (*end)->begcol=0;
  101.             for(line=(*beg)->next; line && line != (*end); line=line->next)
  102.             {
  103.                 line->begcol=0;
  104.                 line->endcol=STRING_LENGTH;
  105.             }
  106.         }
  107.           endline--;
  108.         if((*beg)->begcol==0 && (*end)->endcol>=(*end)->used)
  109.             endline++;
  110.         for(line=wp->wstr,i=0,y=wp->ywork;
  111.              line && y<(wp->ywork+wp->hwork-1);
  112.              line=line->next, i++, y+=wp->hscroll)
  113.             if(line->attr & SELECTED)
  114.             {
  115.                 mark_line(wp,line,i);
  116.             }
  117.         Wcuroff(wp);
  118.         return(TRUE);
  119.     }
  120.     return(FALSE);
  121. }
  122.